package com.lib.framework.utils

import android.content.Context
import android.net.Uri
import android.os.Environment
import java.io.BufferedReader
import java.io.File
import java.io.InputStreamReader


/**
 * 文件工具类
 *
 * @author keanbin
 */
class FileUtil {

    companion object {

        /**
         * 临时目录
         */
        const val TMP_PATH = "/temp/"

        /**
         * 读取Assets中文件的内容
         */
        fun getFromAssets(context: Context, fileName: String): String? {
            try {
                val inputReader = InputStreamReader(context.resources.assets.open(fileName))
                val bufReader = BufferedReader(inputReader)
                var line: String? = null
                var result = ""
                line = bufReader.readLine()
                while (line != null) {
                    result += line
                    line = bufReader.readLine()
                }
                return result
            } catch (e: Exception) {
                e.printStackTrace()
            }
            return null
        }

        /**
         * 获取指定类型的文件夹
         */
        @JvmStatic
        fun getCacheDirByType(context: Context, dirType: String): File? {
            val rootDir = getAppRootDir(context) ?: return null
            val targetDir = File("${rootDir.absolutePath}${File.separator}$dirType")
            if (!targetDir.exists()) {
                targetDir.mkdirs()
            }
            return targetDir
        }

        /**
         * 获取本项目 在外部存储的根目录
         */
        fun getAppRootDir(context: Context): File? {
            if (checkSDCard()) {
                return File(getExternalDir(context).absolutePath, "Accompany")
            }
            return getExternalCacheDir(context)
        }

        /**
         * 获取程序外部的缓存目录
         * @param context
         * @return
         */
        fun getExternalCacheDir(context: Context): File? {
            // 这个sd卡中文件路径下的内容会随着，程序卸载或者设置中清除缓存后一起清空
            return context.externalCacheDir
        }

        /**
         * 获取 外部 存储的根目录
         */
        fun getExternalDir(context: Context): File {
            return Environment.getExternalStorageDirectory()
        }

        /**
         * 检查SD卡是否存在
         *
         * @return
         */
        fun checkSDCard(): Boolean {
            val status = Environment.getExternalStorageState()
            return if (Environment.MEDIA_MOUNTED == status) {
                true
            } else false
        }

        /**
         * 删除文件夹里面的文件，文件夹不删除
         */
        fun deleteFilesInDir(dir: File?): Boolean {
            if (dir == null) return false
            // dir doesn't exist then return true
            if (!dir.exists()) return true
            // dir isn't a directory then return false
            if (!dir.isDirectory) return false
            val files = dir.listFiles()
            if (files != null && files.isNotEmpty()) {
                for (file in files) {
                    if (file.isFile) {
                        if (!file.delete()) return false
                    } else if (file.isDirectory) {
                        if (!deleteDir(file)) return false
                    }
                }
            }
            return true
        }

        /**
         * 删除文件夹
         */
        fun deleteDir(dir: File?): Boolean {
            if (dir == null) return false
            // dir doesn't exist then return true
            if (!dir.exists()) return true
            // dir isn't a directory then return false
            if (!dir.isDirectory) return false
            val files = dir.listFiles()
            if (files != null && files.isNotEmpty()) {
                for (file in files) {
                    if (file.isFile) {
                        if (!file.delete()) return false
                    } else if (file.isDirectory) {
                        if (!deleteDir(file)) return false
                    }
                }
            }
            return dir.delete()
        }

        /**
         * 资源Id 转为 Uri
         */
        fun resIdToUri(context: Context, resId: Int): Uri {
            return Uri.parse("android.resource://" + context.packageName + "/" + resId)
        }

        /**
         * 文件 转为 uri
         */
        fun fileToUri(file: File): Uri {
            return Uri.fromFile(file)
        }

        /**
         * 文件路径 转为 Uri
         */
        fun filePathToUri(filePath: String): Uri {
            return fileToUri(File(filePath))
        }

        /**
         * url to Uri
         */
        fun urlToUri(url: String?): Uri? {
            if (url.isNullOrEmpty()) return null

            return Uri.parse(url)
        }
    }
}